/*
 * @Descripttion: websocket的封装
 * @Author: maybe
 * @Date: 2019-06-25 09:49:35
 */
var ws = new Object; 
let lockReconnect = false; //避免ws重复连接
        // 判断当前浏览器是否支持WebSocket
let wsUrl = '';
// 暂时先默认一个配置项
const BASE_URL = '';

ws.createWebSocket = function(url) {
    wsUrl = BASE_URL + url;
    try{
        if('WebSocket' in window){
            ws = new WebSocket(wsUrl);
        }else if('MozWebSocket' in window){  
            ws = new MozWebSocket(wsUrl);
        }else{          
            alert("您的浏览器不支持websocket协议,建议使用新版谷歌、火狐等浏览器，请勿使用IE10以下浏览器，360浏览器请使用极速模式，不要使用兼容模式！");          
        }

        initEventHandle();
    }catch(e){
        reconnect(wsUrl);
        console.log(e);
    } 
    return ws;  
}
// 暴露在外面  在外面使用


function initEventHandle() {
    ws.onclose = function () {     
        reconnect(wsUrl);
        console.log("ws连接关闭!"+new Date().toUTCString());
    };
    ws.onerror = function (event) {
        reconnect(wsUrl);
        console.log("ws连接错误!");
    };
    ws.onopen = function () {
        heartCheck.reset().start();      //心跳检测重置
        console.log("ws连接成功!"+new Date().toUTCString());
    };
    ws.onmessage = function (event) {    //如果获取到消息，心跳检测重置
        heartCheck.reset().start();      //拿到任何消息都说明当前连接是正常的
    }
}
// 监听窗口关闭事件，当窗口关闭时，主动去关闭websocket连接，防止连接还没断开就关闭窗口，server端会抛异常。
window.onbeforeunload = function() {
    ws.close();
}  
function reconnect(url) {
    if(lockReconnect) return;
    lockReconnect = true;
   
        setTimeout(function () {     //没连接上会一直重连，设置延迟避免请求过多
            try{
            ws.createWebSocket(url);
            lockReconnect = false;
            }
            catch(e){
                // 如果网络不好，持续没连接上页面报错，直接关掉吧
                console.log('网络错误，连接不上')
                ws.close(); 
            }
        }, 4000);
    
    
}
//心跳检测
var heartCheck = {
    timeout: 480000,        //8分钟发一次心跳
    timeoutObj: null,
    serverTimeoutObj: null,
    reset: function(){
        clearTimeout(this.timeoutObj);
        clearTimeout(this.serverTimeoutObj);
        return this;
    },
    start: function(){
        var self = this;
        this.timeoutObj = setTimeout(function(){
            //这里发送一个心跳，后端收到后，返回一个心跳消息，
            //onmessage拿到返回的心跳就说明连接正常
            //心跳的接口
            ws.send("heart");
             self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置，说明后端主动断开了
                 ws.close();     //如果onclose会执行reconnect，我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
             }, self.timeout)
        }, this.timeout)
    }
}
export default ws;